<?php
namespace App\Http\Common;
use Exception;
use Illuminate\Support\Facades\Session;
use Qcloud\Sms\SmsSingleSender;

/**
 * 发送短息
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019-08-14
 * Time: 21:35
 */
class Sms{
    //创建静态私有的变量保存该类对象
    private static $instance;
    //参数
    private $config;
    //防止直接创建对象
    private function __construct($config){
     $this->config = $config;
    }
    //防止克隆对象
    private function __clone(){
    }
    // 使用单列模式
    public static function getInstance($config=null){
        //判断$instance是否是Uni的对象
        //没有则创建
        if (!self::$instance instanceof self) {
            self::$instance = new self($config);
        }
        return self::$instance;
    }

    /**
     * 发送短信息 验证码
     * @param $phoneNumber 电话号码的数组
     * @return bool
     */
    public function sendMessageCode($phoneNumber){
        try {
            Globals::$error = "";
            $appid = MyUtils::getSessionConfig("TENCEN_SMS_APPID");
            $appkey = MyUtils::getSessionConfig("TENCEN_SMS_APPKEY");
            $templateId = MyUtils::getSessionConfig("TENCEN_SMS_TEMPLATEID");
            $smsSign = MyUtils::getSessionConfig("TENCEN_SMS_SMSSIGN");
            $ssender = new SmsSingleSender($appid, $appkey);
            $yzm = MyUtils::randMath();//生成验证码
            $params = [$yzm];// 验证码
            Session::put("yzm",$yzm);//将其保存在session中，5分钟后验证是否过期
            Session::put("phone",$phoneNumber);//将其保存在session中，5分钟后验证是否过期
            Session::put("yzm-time",time());//将其保存在session中，存入时间
            $result = $ssender->sendWithParam("86", $phoneNumber[0], $templateId,
                $params, $smsSign, "", "");
            $result = json_decode($result);
            if ($result->errmsg!='OK'){// 发送错误
                Globals::$error = $result->errmsg;
                return false;
            }else{
                Globals::$error = "";
                return true;
            }
        } catch(Exception $e) {
            Globals::$error = json_decode($e);
            return false;
        }
    }

    /**
     * 发送短信息 验证码
     * @param $phoneNumber 只是一个电话号码 字符串
     * @return bool
     */
    public function sendMessageCodeOne($phoneNumber){
        try {
            if (time()-Session::get('yzm-time')<60){
                Globals::$error = "登录太过频繁，请稍候再试。";
                return false;
            }
            Globals::$error = "";
            $appid = MyUtils::getSessionConfig("TENCEN_SMS_APPID");
            $appkey = MyUtils::getSessionConfig("TENCEN_SMS_APPKEY");
            $templateId = MyUtils::getSessionConfig("TENCEN_SMS_TEMPLATEID");
            $smsSign = MyUtils::getSessionConfig("TENCEN_SMS_SMSSIGN");
            $ssender = new SmsSingleSender($appid, $appkey);
            $yzm = MyUtils::randMath();//生成验证码
            $params = [$yzm];// 验证码
            Session::put("yzm",$yzm);//将其保存在session中，5分钟后验证是否过期
            Session::put("phone",$phoneNumber);//将其保存在session中，5分钟后验证是否过期
            Session::put("yzm-time",time());//将其保存在session中，存入时间
            $result = $ssender->sendWithParam("86", $phoneNumber, $templateId,
                $params, $smsSign, "", "");
            $result = json_decode($result);
            if ($result->errmsg!='OK'){// 发送错误
                Globals::$error = $result->errmsg;
                return false;
            }else{
                Globals::$error = "";
                return true;
            }
        } catch(Exception $e) {
            Globals::$error = json_decode($e);
            return false;
        }
    }

    /**
     * 验证短信息 验证码
     * @param $code
     * @return bool|int
     */
    public function checkMessageCode($code){
        try {
            if ($code == MyUtils::getSessionConfig("CODE")){//万能验证码，默认为555555，在数据库里面配置
                return 1;
            }
            $offset = MyUtils::getSessionConfig("CODE_TIME");
            $yzmTime= Session::get("yzm-time");
            $time = time() - $yzmTime;// 相差时间
            if ($yzmTime!=null && $time - $offset>0){// 相差时间超过了 5分钟，就返回验证码超时
                Session::remove("yzm");
                Session::remove("yzm-time");
                Globals::$error = "验证码超时！请重新发送验证码！";
                return -1;// 验证码超时 移除验证码
            }else{
                if (!$code){
                    Globals::$error = "请输入验证码";
                    return false;
                }
                if ($code == Session::get("yzm")) return 1;
                else {
                    Globals::$error = "验证码错误！请重新输入验证码！";
                    return -2;
                }// 验证码错误
            }
        } catch(Exception $e) {
            Globals::$error = "验证异常！请确认电话号码正确！";
            return -3;
        }
    }
}
